﻿Imports MySql.Data.MySqlClient

Public Class frmTratadoraProcesar
    Dim ofd As New OpenFileDialog
    Dim fbd As New FolderBrowserDialog

    Dim group As String
    Dim varDate As Date
    Dim time As Date
    Dim usuario_tratadora As String
    Dim message() As String

    Dim procesados As Integer = 0
    Dim repetidos As Integer = 0
    Dim insertados As Integer = 0
    Dim incorrectos As Integer = 0

    Private Sub frmTratadoraProcesar_load(sender As Object, e As EventArgs) Handles MyBase.Load
        Inicializar()
    End Sub

    Private Sub btnLote_Click(sender As Object, e As EventArgs) Handles btnLote.Click

        If MsgBox("¿Desea descargar y procesar los archivos de LOTE?", vbExclamation + vbYesNo, "ATENCIÓN") = vbNo Then
            Exit Sub
        End If

        'Obtengo datos de conexion a la tratadora
        Dim dr As MySqlDataReader
        Dim ip As String
        Dim usuario As String
        Dim clave As String

        sql = "SELECT ip, usuario, clave FROM tratadoras WHERE id=" & varIdTratadora
        Dim cmd As New MySqlCommand(sql)
        dr = cn.getResultados(cmd)

        'Esta validacion no deberia ser cierta nunca
        If dr.HasRows = False Then
            MsgBox("No se encontró la tratadora con id " & varIdTratadora, vbExclamation + vbOKOnly, "Atención")
            dr.Close()
            Exit Sub
        End If

        'Como es un solo registro no lo recorro
        'While dr.Read()
        dr.Read()
        ip = dr("ip")
        usuario = dr("usuario")
        clave = dr("clave")
        'End While

        dr.Close()
        cn.Cerrar()

        'Descargo archivos
        DescargarArchivos("lote", ip, usuario, clave)

        SeleccionarArchivos("lote")

        ProcesarLote()

        EliminarArchivos("lote")

        'ofd.Filter = "CSV files (*.CSV)|*.csv"
        'ofd.FilterIndex = 1
        'ofd.RestoreDirectory = True
        'ofd.Multiselect = True

        'If ofd.ShowDialog = Windows.Forms.DialogResult.OK AndAlso ofd.FileName <> "" Then
        '    If ofd.FileNames.Count > 0 Then
        '        btnLoteProcesar.Visible = True
        '        Inicializar()
        '        lblLoteNumero.Text = ofd.FileNames.Count
        '    End If
        'End If



    End Sub

    Private Sub btnLoteProcesar_Click(sender As Object, e As EventArgs) Handles btnLoteProcesar.Click

        Try
            Me.Cursor = System.Windows.Forms.Cursors.WaitCursor

            cn.BeginTransaction()

            'Recorro todos los archivos seleccionados
            For Each file In ofd.FileNames

                Dim CSVTest As List(Of String) = New List(Of String)
                'Read the file and put each line into a list.  Each line will be an item with subitems in the listview
                CSVTest = System.IO.File.ReadAllLines(file).ToList

                'This adds the rest of the data from the file to the listview.  If the first line of the file is data and not header text, then change `For I = 1 To CSVTest.Count - 1` to `For I = 0 To CSVTest.Count - 1`
                'Recorro cada registro del archivo
                For I = 3 To CSVTest.Count - 1
                    procesados = procesados + 1
                    Dim col() As String = CSVTest(I).Split(ControlChars.NewLine)
                    Dim NewLVItem As ListViewItem = New ListViewItem(col(0))
                    NewLVItem.Name = col(0)
                    For j = 1 To col.Count - 1
                        NewLVItem.SubItems.Add(col(j))
                    Next
                    'MsgBox(NewLVItem.Name)

                    Dim Text, DelimitedText() As String, Delimiter As Char = ControlChars.Tab
                    Text = NewLVItem.Name
                    DelimitedText = Text.Split(ControlChars.Tab)

                    'Separo cada campo separado por TABULACION del registro
                    For k = 0 To DelimitedText.GetUpperBound(0)
                        If DelimitedText(k).Trim <> "" Then
                            Select Case k
                                Case 0
                                    group = DelimitedText(k)
                                Case 1 'Date
                                    varDate = DelimitedText(k)
                                Case 2 'Time
                                    time = DelimitedText(k)
                                Case 3 'User Name
                                    usuario_tratadora = DelimitedText(k)
                                Case 4 'Message
                                    'Separo cada valor separado por "," del campo message
                                    message = Split(DelimitedText(k), ",")
                                Case Else
                                    MsgBox("El archivo que esta procesando tiene más campos que los esperados", vbExclamation + vbOKOnly, "Atención")
                                    Exit Sub

                            End Select
                        End If
                    Next

                    If Validar("lotes") = True Then
                        InsertarRegistro("lotes")
                    End If

                Next

            Next file

            'Resultados
            lblGrupo.Text = "LOTE"
            lblArchivos.Text = ofd.FileNames.Count
            lblProcesados.Text = procesados
            lblIncorrectos.Text = incorrectos
            lblRepetidos.Text = repetidos
            lblInsertados.Text = insertados

            lblLoteNumero.Text = 0
            btnLoteProcesar.Visible = False

            cn.CommitTransaction()

            Me.Cursor = System.Windows.Forms.Cursors.Default

            MsgBox("Proceso exitoso", vbOKOnly + MsgBoxStyle.Information)

            'Limpio contadores
            procesados = 0
            incorrectos = 0
            repetidos = 0
            insertados = 0

        Catch ex As Exception
            cn.RollbackTransaction()
            Me.Cursor = System.Windows.Forms.Cursors.Default
            MensajeError()
        End Try

    End Sub

    Private Sub Inicializar()
        lblLoteNumero.Text = 0
        lblBatchNumero.Text = 0
        lblCalibracionNumero.Text = 0
        lblEventosNumero.Text = 0
        lblAlarmasNumero.Text = 0

        lblGrupo.Text = ""
        lblArchivos.Text = 0
        lblProcesados.Text = 0
        lblIncorrectos.Text = 0
        lblRepetidos.Text = 0
        lblInsertados.Text = 0
    End Sub

    Private Function Validar(tabla As String) As Boolean
        Dim grupo As String

        Select Case tabla
            Case "lotes"
                grupo = "LOTE"
        End Select
        'Chequeo si el grupo del archivo es correcto
        If group <> grupo Then
            incorrectos = incorrectos + 1
            Return False
        End If

        'Chequeo si el nombre de la tratadora es la que corresponde a la tratadora seleccionada
        If message(0) <> varNombreTratadora Then
            incorrectos = incorrectos + 1
            Return False
        End If

        'Chequeo que no exista el registro buscando por fecha y tratadora_id
        sql = "Select fecha From " & tabla & " Where fecha='" & Format(varDate, "yyyy-MM-dd") & " " & time & "' and tratadora_id = " & varIdTratadora
        Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(sql)
        If Not IsNothing(cn.getScalar(cmd)) Then
            repetidos = repetidos + 1
            Return False
        End If

        Return True

    End Function

    Private Sub InsertarRegistro(tabla As String)

        Try

            sql = "INSERT INTO " & tabla & " (variedad, lote, fecha, usuario_tratadora, peneira, razon, cuit, nombre_receta, peso_procesar, consumo_l1, consumo_l2, consumo_l3, consumo_l4, consumo_l5, consumo_l6, consumo_p1, consumo_p2, peso_total, cantidad_batch, tratadora_id) VALUES (@variedad, @lote, @fecha, @usuario_tratadora, @peneira, @razon, @cuit, @nombre_receta, @peso_procesar, @consumo_l1, @consumo_l2, @consumo_l3, @consumo_l4, @consumo_l5, @consumo_l6, @consumo_p1, @consumo_p2, @peso_total, @cantidad_batch, @tratadora_id)"

            Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(sql)

            cmd.Parameters.Add("@variedad", MySqlDbType.VarChar, 50, "variedad")
            cmd.Parameters.Add("@lote", MySqlDbType.VarChar, 50, "lote")
            cmd.Parameters.Add("@fecha", MySqlDbType.DateTime, 8, "fecha")
            cmd.Parameters.Add("@usuario_tratadora", MySqlDbType.VarChar, 50, "usuario_tratadora")
            cmd.Parameters.Add("@peneira", MySqlDbType.VarChar, 50, "peneira")
            cmd.Parameters.Add("@razon", MySqlDbType.VarChar, 50, "razon")
            cmd.Parameters.Add("@cuit", MySqlDbType.VarChar, 50, "cuit")
            cmd.Parameters.Add("@nombre_receta", MySqlDbType.VarChar, 50, "nombre_receta")
            cmd.Parameters.Add("@peso_procesar", MySqlDbType.Double, 12, "peso_procesar")
            cmd.Parameters.Add("@consumo_l1", MySqlDbType.Double, 7, "consumo_l1")
            cmd.Parameters.Add("@consumo_l2", MySqlDbType.Double, 7, "consumo_l2")
            cmd.Parameters.Add("@consumo_l3", MySqlDbType.Double, 7, "consumo_l3")
            cmd.Parameters.Add("@consumo_l4", MySqlDbType.Double, 7, "consumo_l4")
            cmd.Parameters.Add("@consumo_l5", MySqlDbType.Double, 7, "consumo_l5")
            cmd.Parameters.Add("@consumo_l6", MySqlDbType.Double, 7, "consumo_l6")
            cmd.Parameters.Add("@consumo_p1", MySqlDbType.Double, 7, "consumo_p1")
            cmd.Parameters.Add("@consumo_p2", MySqlDbType.Double, 7, "consumo_p2")
            cmd.Parameters.Add("@peso_total", MySqlDbType.Double, 12, "peso_total")
            cmd.Parameters.Add("@cantidad_batch", MySqlDbType.Int32, 5, "cantidad_batch")
            cmd.Parameters.Add("@tratadora_id", MySqlDbType.Int64, 20, "tratadora_id")

            cmd.Parameters("@variedad").Value = message(1)
            cmd.Parameters("@lote").Value = message(2)
            cmd.Parameters("@fecha").Value = Format(varDate, "yyyy-MM-dd") & " " & time
            cmd.Parameters("@usuario_tratadora").Value = usuario_tratadora
            cmd.Parameters("@peneira").Value = message(3)
            cmd.Parameters("@razon").Value = message(4)
            cmd.Parameters("@cuit").Value = message(5)
            cmd.Parameters("@nombre_receta").Value = message(6)
            cmd.Parameters("@peso_procesar").Value = message(7)
            cmd.Parameters("@consumo_l1").Value = message(8)
            cmd.Parameters("@consumo_l2").Value = message(9)
            cmd.Parameters("@consumo_l3").Value = message(10)
            cmd.Parameters("@consumo_l4").Value = message(11)
            cmd.Parameters("@consumo_l5").Value = message(12)
            cmd.Parameters("@consumo_l6").Value = message(13)
            cmd.Parameters("@consumo_p1").Value = message(14)
            cmd.Parameters("@consumo_p2").Value = message(15)
            cmd.Parameters("@peso_total").Value = message(16)
            cmd.Parameters("@cantidad_batch").Value = message(17)
            cmd.Parameters("@tratadora_id").Value = varIdTratadora

            cn.ExecNonQuery(cmd)

            insertados = insertados + 1

        Catch ex As Exception
            Throw New Exception(Err.Description)
        End Try

    End Sub

    Private Sub DescargarArchivos(group As String, ip As String, usuario As String, clave As String)
        Dim comando As String
        Dim carpeta As String

        Select Case group
            Case "lote"
                carpeta = "LOTES"
        End Select

        comando = "datatransfertool -ip " & ip & " -user " & usuario & " -pwd " & clave & " -get -secondary -remotedatafolder Alarm/" & carpeta & " -localfolder c:\ALARM\" & carpeta & " -r"

        Dim f As New frmEsperar
        f.Show()
        Application.DoEvents()
        Shell(comando, AppWinStyle.Hide, True, 60000)
        f.Close()

    End Sub

    Private Sub SeleccionarArchivos(group As String)
        Dim carpeta As String

        Select Case group
            Case "lote"
                carpeta = "c:\ALARM\LOTES"
        End Select

        'le indicamos el path que queremos  
        Dim ContadorDeArchivos As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
        'nos devuelve la cantidad de archivos
        ContadorDeArchivos = My.Computer.FileSystem.GetFiles(carpeta)
        lblLoteNumero.Text = ContadorDeArchivos.Count

    End Sub

    Private Sub ProcesarLote()

        Dim carpeta As String = "c:\ALARM\LOTES"

        Try
            Me.Cursor = System.Windows.Forms.Cursors.WaitCursor

            cn.BeginTransaction()

            'Recorro todos los archivos seleccionados
            For Each Archivo As String In My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv")

                Dim CSVTest As List(Of String) = New List(Of String)
                'Read the file and put each line into a list.  Each line will be an item with subitems in the listview
                CSVTest = System.IO.File.ReadAllLines(Archivo).ToList

                'This adds the rest of the data from the file to the listview.  If the first line of the file is data and not header text, then change `For I = 1 To CSVTest.Count - 1` to `For I = 0 To CSVTest.Count - 1`
                'Recorro cada registro del archivo
                For I = 3 To CSVTest.Count - 1
                    procesados = procesados + 1
                    Dim col() As String = CSVTest(I).Split(ControlChars.NewLine)
                    Dim NewLVItem As ListViewItem = New ListViewItem(col(0))
                    NewLVItem.Name = col(0)
                    For j = 1 To col.Count - 1
                        NewLVItem.SubItems.Add(col(j))
                    Next
                    'MsgBox(NewLVItem.Name)

                    Dim Text, DelimitedText() As String, Delimiter As Char = ControlChars.Tab
                    Text = NewLVItem.Name
                    DelimitedText = Text.Split(ControlChars.Tab)

                    'Separo cada campo separado por TABULACION del registro
                    For k = 0 To DelimitedText.GetUpperBound(0)
                        If DelimitedText(k).Trim <> "" Then
                            Select Case k
                                Case 0
                                    group = DelimitedText(k)
                                Case 1 'Date
                                    varDate = DelimitedText(k)
                                Case 2 'Time
                                    time = DelimitedText(k)
                                Case 3 'User Name
                                    usuario_tratadora = DelimitedText(k)
                                Case 4 'Message
                                    'Separo cada valor separado por "," del campo message
                                    message = Split(DelimitedText(k), ",")
                                    'InsertarRegistro("lotes")
                                Case Else
                                    MsgBox("El archivo que esta procesando tiene más campos que los esperados", vbExclamation + vbOKOnly, "Atención")
                                    Exit Sub

                            End Select
                        End If
                    Next

                    If Validar("lotes") = True Then
                        InsertarRegistro("lotes")
                    End If

                Next

            Next Archivo

            'Resultados
            lblGrupo.Text = "LOTE"
            lblArchivos.Text = My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv").Count
            lblProcesados.Text = procesados
            lblIncorrectos.Text = incorrectos
            lblRepetidos.Text = repetidos
            lblInsertados.Text = insertados

            lblLoteNumero.Text = 0
            btnLoteProcesar.Visible = False

            cn.CommitTransaction()

            Me.Cursor = System.Windows.Forms.Cursors.Default

            MsgBox("Fin de proceso", vbOKOnly + MsgBoxStyle.Information)

            'Limpio contadores
            procesados = 0
            incorrectos = 0
            repetidos = 0
            insertados = 0

        Catch ex As Exception
            cn.RollbackTransaction()
            Me.Cursor = System.Windows.Forms.Cursors.Default
            MensajeError()
        End Try

    End Sub

    Private Sub EliminarArchivos(group As String)
        Dim carpeta As String
        Select Case group
            Case "lote"
                carpeta = "c:\ALARM\LOTES"
        End Select

        For Each Archivo As String In My.Computer.FileSystem.GetFiles(carpeta, FileIO.SearchOption.SearchAllSubDirectories, "*.csv")

            My.Computer.FileSystem.DeleteFile(Archivo, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)

        Next Archivo
    End Sub

End Class